package com.qf.consumer;

import com.qf.dao.ProductDao;
import com.qf.dao.impl.ProducDaoIml;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName Demo
 * @Description TODO
 * @Author 86181
 * @Date 2022/8/31 20:34
 * @Version 1.0
 **/
public class Demo {
    public static void main(String[] args) {
      final ProductDao productDao=new ProducDaoIml();
      productDao.buyProduct("厂家");
      productDao.sh("厂家");
      //通过代理去买电脑  对目标类进行增强操作
        //第一个参数:类加载器 目标类的类加载器 目标对象.getClass.getClassLoader
        //第二个参数:字节码数组(目标对象实现的接口字节码) getInterfaces 获取目标类所实现的接口
        //第三个参数:增强业务逻辑
        //获取代理对象
       ProductDao o=(ProductDao) Proxy.newProxyInstance(productDao.getClass().getClassLoader(), productDao.getClass().getInterfaces(),
                new InvocationHandler() {
           //proxy:代理对象 基本不用   method:代理对象要执行的方法对象  args:要执行的方法参数
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //method.getName()  获取当前执行的方法名称
                if ("buyProduct".equals(method.getName())){
                    System.out.println("通过代理执行了业务增强");
                    //执行目标方法
                    method.invoke(productDao,args);
                }
                if ("sh".equals(method.getName())){
                    System.out.println("代理帮忙处理售后");
                    method.invoke(productDao,args);
                }
                return null;
            }
        });
       o.sh("代理");
    }
}
